﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace BPM.Base.Tools
{
    public static class PredicateExtensions
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }

        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1,
                Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2,
                expression1.Parameters.Cast<Expression>());

            return Expression.Lambda<Func<T, bool>>(Expression.Or(
                expression1.Body, invokedExpression),
                expression1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
                Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2,
                expression1.Parameters.Cast<Expression>());

            return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body,
                invokedExpression), expression1.Parameters);
        }
    }

    public class QueryableOrderEntry<TSource, TKey>
    {
        public QueryableOrderEntry(Expression<Func<TSource, TKey>> expression)
        {
            this.Expression = expression;
            OrderDirection = OrderDirection.ASC;
        }

        public QueryableOrderEntry(Expression<Func<TSource, TKey>> expression,
                  OrderDirection orderDirection)
        {
            this.Expression = expression;
            OrderDirection = orderDirection;
        }
        public Expression<Func<TSource, TKey>> Expression
        {
            get;
            set;
        }

        public OrderDirection OrderDirection
        {
            get;
            set;
        }
    }

    public enum OrderDirection
    {
        ASC, DESC
    }
}
